import zstd
import zlib
import unishox2
import codecs

numbers = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV".lower()

word_map = "哈基米那咩路多阿西噶呀库奶龙曼波欧码激励亚不有待南北绿豆扎布夜大"
word_map = list(word_map)

assert len(word_map) == len(set(word_map)), "映射字符不能出现重复"

print(f"{len(word_map)=},")


def compresser(data: bytes):
    """压缩长度"""
    kernel = lambda data: zlib.compress(data, 9)
    return kernel(data)


def transformer(hex_str, from_base=16, to_base=32):
    """将16进制字符串转为 len(word_map) 进制表示"""

    num = int(hex_str, from_base)
    if num == 0:
        return [0]

    digits = []
    while num:
        digits.append(num % to_base)
        num //= to_base

    # 反转数组，因为计算是从低位到高位的
    digits.reverse()
    return digits


def encode(text: str):
    """编码哈基米语言"""
    compressed = compresser(text.encode("utf-8"))
    # encoded = encoder(compressed)

    compressed = compressed.hex()
    digits = transformer(compressed, from_base=16, to_base=len(word_map))

    output = ""
    for digit in digits:
        output += word_map[digit]

    # encoded = encoder(compressed)
    return output


def decode(encoded: str):
    """解码哈基米语言"""
    number_maps = []

    for char in encoded:
        try:
            idx = word_map.index(char)
            number_maps.append(idx)
        except ValueError:
            continue

    # number_maps = [(word_map.index(char)) for char in encoded]
    number_maps = [numbers[i] for i in number_maps]
    number_text = "".join(number_maps)

    # 复原成hex字符串并转为bytes
    hex_text = transformer(number_text, from_base=len(word_map), to_base=16)
    hex_text = "".join(hex(i)[2:] for i in hex_text)
    hex_text = bytes.fromhex(hex_text)
    hex_text = zlib.decompress(hex_text).decode("utf-8")

    return hex_text


if __name__ == "__main__":
    original_text = """
           哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
            哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
             哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
              哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
             哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
              哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，
               哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米
             哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网哈基米， 哈基米， 哈基米， 哈基米， 哈基米，网
           哈基米， 哈基米， 哈キ米， 哈キ米， 哈キミ，网ハキミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网ハキミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网
           哈キミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网ハキミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网
           哈キミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网ハキミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网
           哈キミ， 哈キミ， 哈キミ， 哈キミ， 哈キミ，网络流行语，日语はちみ（hachimi） [6]の音译，原指一种蜂蜜饮料。因为在动漫《赛马娘 Pretty Derby》第二季中东海帝王非常喜欢喝蜂蜜水，所以哼唱起了蜂蜜之歌， [1]里面不断重复着“ハキミ”的歌词，经过网友们的调音，也就成为了大家所熟悉的背景音乐。 [2]而近年来，由于背景音乐の走红，猫再次被使用“ハキミ”称呼，凸显其在青年一代心目中独特的地位。 [5]
2023年11月，“ハキミ”入选三連生活週刊发布的2023年度十大熱梗。 [3]hello 我は岸边世界"""

    encrypted = """夜多绿布有噶扎绿豆有绿西哈呀西库布北扎欧亚波绿米咩路不噶大西哈波绿哈夜有路亚米有噶基米亚有不基西北奶励豆亚奶那波大多绿米哈龙咩不咩励米绿扎米亚咩西曼米哈豆噶
亚哈奶不有咩多夜咩有波那待奶绿夜曼咩路噶绿基北呀绿亚西米不码库布呀多亚码噶库豆扎扎布波库励扎南布有波豆咩南夜励码南那西南米励哈波基有待北奶奶大不呀夜路那奶库
豆布不豆米奶南有励哈励北多南阿夜欧奶龙米大南南绿多大亚波有不南路奶噶码路奶奶阿米西米不励夜大阿西有欧噶欧呀布北西米亚布布路波待波西阿激北大亚奶南激龙呀激码布
米待布阿扎西大咩布噶北激布扎亚待北北哈库米待布路南路龙波哈咩夜西亚北米有亚哈待码奶奶夜米扎北激夜待励阿有励波有夜库库路西亚亚波激库哈待北那哈龙基波大米亚米奶
北不基奶噶噶那呀励北欧奶西夜南豆绿绿北不豆不有米布绿西那曼励欧那激激米夜奶北扎米阿待西波亚亚波库绿库奶米米欧基路阿北有南龙北欧待夜码阿绿呀路布豆布多夜豆绿大
波西波路布大龙不那夜欧那路奶北奶扎西亚夜基布南西多南咩北奶奶米待哈哈多布奶呀西阿西绿励扎哈多咩绿阿西绿不不亚路欧绿南那不哈北南激西咩库基米扎噶豆夜米绿哈多夜
亚南北夜待欧码路夜豆夜亚咩不待噶码有励呀奶亚北码激励扎路波哈绿那噶有南咩龙曼绿有那基豆南基励阿那西北布哈那曼激布夜待曼哈基欧北布励码励待奶奶基码夜绿米欧米布
大北西库大励绿阿阿不激库西激豆扎噶米北豆码噶南呀不有激咩多待哈码励亚绿米亚阿南呀噶那欧那多曼波西南库南路哈码路码励龙多豆基欧励噶呀路西夜码豆米库基扎西波哈不
布绿激多呀西夜咩激阿路码奶龙库欧咩豆呀曼欧码大库夜亚南波米呀待有扎大激激基阿码豆北不不亚曼待那不哈咩扎西绿有码奶豆南波北基夜奶那绿待布曼待西噶扎哈布不库多呀
阿激阿有励激龙不励码曼哈亚豆多那奶奶夜布基路大北米曼大欧阿米南路多有那激路欧激有多北奶龙米路曼奶咩哈布夜西库激布绿呀夜奶绿码西激北扎噶路有南码南那南励待不欧
呀西路励咩扎阿欧龙待西码米欧咩米布基布西南库不激龙阿波南咩咩龙亚路西西咩绿欧龙有哈码奶噶波励波哈大待欧有绿路激夜那阿待咩南夜绿阿绿大基库待绿呀奶待噶那有曼豆
波咩不龙呀码米曼波哈绿大多咩大待龙米库曼多哈阿夜亚龙扎励多库南呀咩"""

    result = encode(original_text)
    print(result)
    print(len(result))
    print(decode(encrypted) == original_text)
